package main

import "fmt"

type struct1 struct {
	i1  int
	f1  float32
	str string
}
type worker struct {
	name string
	age  int
	sex  string
}
type twoInts struct {
	a int
	b int
}

func (w worker) work() {
	fmt.Println(w.name, "在工作。。")

}

func (add *twoInts) addThem(para int) int {
	sum := add.a + add.b + para
	return sum

}
func main() {
	var i1 = 5
	fmt.Printf("数值为: %d, 地址: %p\n", i1, &i1)
	var intP *int
	intP = &i1
	fmt.Println(&intP)
	fmt.Printf("地址为:%p 数值为: %d\n", intP, *intP)
	var intPP **int
	intPP = &intP
	fmt.Print(intPP, &intPP, *intPP, **intPP)
	//结构体默认深拷贝,并且为值类型数据

	ms := new(struct1)
	ms.i1 = 10
	ms.f1 = 15.5
	ms.str = "Chris"
	fmt.Print(ms.i1)
	fmt.Print(ms.f1)
	fmt.Print(ms.str)
	fmt.Println(ms)

	ms2 := struct1{i1: 11, f1: 25.3, str: "aa"}
	fmt.Println(ms2)

	type teacher struct {
		ax, ay int
	}
	type student struct {
		teacher
		bx, by float32
	}

	b := student{teacher{1, 2}, 3.0, 4.0}
	fmt.Println(b.ax, b.ay, b.bx, b.by)
	fmt.Println(b.teacher)
	/*
		一个方法就是一个包含了接受者的函数，接受者可以是命名类型或者结构体类型的一个值或者是一个指针,
		所有给定类型的方法属于该类型的方法集
		方法:method
		语法:
		func(接受者)方法名(参数列表)(返回值列表){
		总结:method，同函数类似，区别需要有接受者。
	*/
	w1 := worker{name: "王二狗", age: 30, sex: "男"}
	w1.work()
	/*
		对比函数:
		A:意义方法:某个类别的行为功能，需要指定的接受者调用函数:一段独立功能的代码，可以直接调用
		B:语法
		方法:方法名可以相同，只要接受者不同函数:命名不能冲突
	*/
	ti := twoInts{3, 4}

	fmt.Println(ti.addThem(5))

}
